#include "kc.h"
#include "kasm.h"

extern char * video;
extern int d_cant_rows;
extern int d_frow;
extern int screen_pos;
extern int r_screen_pos;
extern int prompt_pos;

/***************************************************************
*k_clear_screen
*
* Borra la pantalla en modo texto color.
****************************************************************/

void k_clear_screen() 
{
	char *vidmem = (char *) 0xb8000;
	unsigned int i=0;
	while(i < (80*25*2))
	{
		vidmem[i]=' ';
		i++;
		vidmem[i]=WHITE_TXT;
		i++;
	};
}

/***************************************************************
*setup_IDT_entry
* Inicializa un descriptor de la IDT
*
*Recibe: Puntero a elemento de la IDT
*	 Selector a cargar en el descriptor de interrupcion
*	 Puntero a rutina de atencion de interrupcion	
*	 Derechos de acceso del segmento
*	 Cero
****************************************************************/

void setup_IDT_entry (DESCR_INT *item, byte selector, dword offset, byte access,
			 byte cero) {
  item->selector = selector;
  item->offset_l = offset & 0xFFFF;
  item->offset_h = offset >> 16;
  item->access = access;
  item->cero = cero;
}


char
readVideo (int pos)
{
    return video[pos];
}

int writeWrapper(const void * buff, int size)
{
    FD fd;
    int i;
    char c;
    const void * aux = buff+size;
    int row, col;
    
    /* se chequea la posicion del cursor en pantalla para ver si hay que correr
     * la pantalla*/
    
    if( screen_pos >= (CANT_COLS * d_cant_rows) * VID_CHAR )
    {
        screen_pos = d_frow * CANT_COLS * VID_CHAR;
        
        /*se copian los caracteres de una linea hacia arriba*/
        for(row = d_frow + 1; row < d_cant_rows; row++)
            for(col = 0; col < CANT_COLS * VID_CHAR; col+= 2)
            {
                c = readVideo(row*CANT_COLS*VID_CHAR+col);
                write (fd, &c, 1);
            }
		/* se blanquea la ultima linea */    
        screen_pos= CANT_COLS * (d_cant_rows-1) * VID_CHAR;
        for(i = 0; i < CANT_COLS; i++)
        {
            c = ' ';
            write (fd, &c, 1); 
        }
        screen_pos= CANT_COLS * (d_cant_rows-1) * VID_CHAR;
    }
    
    /* se realiza la accion segun el caracter del buffer que se envie*/
    for(i = 0;  i < size; i++)
    {
        if(*((char *)buff+i) == '\t')
            screen_pos += 4 * VID_CHAR;
        else if(*((char *)buff+i) == '\n')
            screen_pos += 80*VID_CHAR - (screen_pos % (80 * VID_CHAR));
        else if(*((char *)buff+i) == '\b')
        {
            if( screen_pos != 0 && screen_pos - VID_CHAR > prompt_pos)
            {
                screen_pos -= VID_CHAR;
                write(fd, " ", 1);
                screen_pos -= VID_CHAR;
            }
        }
        else
            write(fd, buff+i,1);
    }
    return size;
}
